package com.oneday.ashop.core.base.util;

import com.google.common.collect.Maps;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 集合工具类
 * User:bob.yang
 * Date 2015/7/28 0028
 */
public class CollectionUtil {

    /**
     * 把map集合转换成list集合
     * @param map
     * @return
     */
    public static <T,M> List<M> buildList(Map<T, M> map) {
        Iterator iterator = map.keySet().iterator();
        List<M> list = new ArrayList<>();
        while(iterator.hasNext()) {
            Object key = iterator.next();
            list.add(map.get(key));
        }
        return list;
    }

    /**
     * 创建指定属性为KEY, objs的每个元素为值的Multimap的Map集合。
     *
     * @param objs 数组
     * @param keyClazz 值类型，即{@code property}的类型
     * @param valClazz 值类型
     * @param property 属性名
     * @param <K> 泛型
     * @param <V> 泛型
     * @return 指定属性的Map集合
     */
    @SuppressWarnings("unchecked")
    public static <K, V> Map<K, V> buildMap(List<V> objs, Class<K> keyClazz, Class<V> valClazz,
                                            String property) {
        if (objs.isEmpty()) {
            return Maps.newHashMapWithExpectedSize(0);
        }
        Map<K, V> results = Maps.newHashMapWithExpectedSize(objs.size());
        try {
            Field field = getField(objs, property);
            for (V obj : objs) {
                K key = (K) field.get(obj);
                results.put(key, obj);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return results;
    }

    /**
     * 创建指定属性为KEY, objs的每个元素为值的Multimap的Map集合。
     *
     * @param objs 数组
     * @param keyClazz 值类型，即{@code property}的类型
     * @param valClazz 值类型
     * @param property 属性名
     * @param <K> 泛型
     * @param <V> 泛型
     * @return 指定属性的Map集合
     */
    @SuppressWarnings("unchecked")
    public static <K, V> List<V> buildList(List<K> objs, Class<V> valClazz,
                                            String property) {
        List<V> result = new ArrayList<>();
        if (objs.isEmpty()) {
            return result;
        }
        try {
            Field field = getField(objs, property);
            for (K obj : objs) {
                V value = (V) field.get(obj);
                result.add(value);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return result;
    }

    /**
     * @param objs     对象数组
     * @param property 属性
     * @return 对象元素里的指定属性Field, 并设置该field可以被访问
     */
    public static Field getField(List<?> objs, String property) {
        Field field = ReflectionUtils.findField(objs.get(0).getClass(), property);
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        return field;
    }

    /**
     * 初始化图片格式list
     * @return
     */
    public static List<String> initImageType() {
        List<String> imageTypeList = new ArrayList<>();
        imageTypeList.add("jpg");
        imageTypeList.add("bmp");
        imageTypeList.add("png");
        imageTypeList.add("jpeg");
        return imageTypeList;
    }

    /**
     * 初始化电子书格式list
     * @return
     */
    public static List<String> initBookType() {
        List<String> bookTypeList = new ArrayList<>();
        bookTypeList.add("txt");
        bookTypeList.add("chm");
        bookTypeList.add("epub");
        bookTypeList.add("umd");
        return bookTypeList;
    }

    /**
     * 数组转化成list
     * @param array
     * @param <T>
     * @return
     */
    public static  <T> List<T> exchangeArrayToList(T[] array) {
        List<T> list = new ArrayList<>();
        for(T t : array) {
            list.add(t);
        }
        return list;
    }
}
